home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
C++
/
Frameworks
/
Sprocket Framework DR2
/
Sprocket Framework
/
Preferences.cp
< prev
next >
Wrap
Text File
|
1996-06-15
|
5KB
|
232 lines
/*
File: Preferences.cp
Project: Sprocket Framework 1.1 (DR2), released 6/15/96
Contains: Routine to open/create a prefs file
To Do: Provide full preferences file support, including reading/writing
This may become a sub-class of TFile
Sprocket Major Contributors:
----------------------------
Dave Falkenburg, producer of Sprocket 1.0
Bill Hayden, producer of Sprocket 1.1
Steve Sisak, producer of the upcoming Sprocket 2.0
Pete Alexander Steve Falkenburg Randy Thelen
Eric Berdahl Nitin Ganatra Chris K. Thomas
Marshall Clow Dave Hershey Leonard Rosenthal
Tim Craycroft Dave Mark Dean Yu
David denBoer Gary Powell
Cameron Esfahani Jon Summers Apple Computer, Inc.
Comments, Additions, or Corrections:
------------------------------------
Bill Hayden, Nikol Software <nikol@codewell.com>
*/
#include "Preferences.h"
#include "SprocketMacros.h"
#include "SprocketConstants.h"
#include "UString.h"
#include "UResources.h"
#include <Processes.h>
#define kPrefID 128
/*****************************************************************************/
TPreferencesFile::TPreferencesFile()
{
}
/*****************************************************************************/
OSErr TPreferencesFile::OpenPreferencesFile(Boolean CreateIfNotFound)
{
OSErr err;
short prefsVRefNum;
long prefsDirID;
HParamBlockRec pb;
Str255 prefsFileName;
err = RMCurResFileCompat(&fAppResFile);
if (err != noErr)
return err;
err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
&prefsVRefNum, &prefsDirID);
if (err != noErr) // Couldn’t find preferences folder, something is wrong
return err;
GetIndString(prefsFileName, kPreferencesFileStrings, kPreferencesFileName);
// Try opening the Preferences file
fPrefResFile = HOpenResFile(prefsVRefNum, prefsDirID, prefsFileName, fsRdWrPerm);
if ( (fPrefResFile == -1) && CreateIfNotFound )
{
// Get the application’s creator
ProcessInfoRec processInfo;
ProcessSerialNumber currentProc = {0, kCurrentProcess};
processInfo.processInfoLength = sizeof(ProcessInfoRec);
processInfo.processName = nil;
processInfo.processAppSpec = nil;
err = GetProcessInformation(¤tProc, &processInfo);
if (err)
return err;
// Couldn’t open prefs file, try making a new one
HCreateResFile(prefsVRefNum, prefsDirID, prefsFileName);
pb.fileParam.ioNamePtr = prefsFileName;
pb.fileParam.ioVRefNum = prefsVRefNum;
pb.fileParam.ioDirID = prefsDirID;
pb.fileParam.ioFDirIndex = 0;
err = PBHGetFInfoSync(&pb);
pb.fileParam.ioNamePtr = prefsFileName;
pb.fileParam.ioVRefNum = prefsVRefNum;
pb.fileParam.ioDirID = prefsDirID;
pb.fileParam.ioFDirIndex = 0;
pb.fileParam.ioFlFndrInfo.fdType = 'pref';
pb.fileParam.ioFlFndrInfo.fdCreator = processInfo.processSignature;
pb.fileParam.ioFlFndrInfo.fdFlags = 0;
err = PBHSetFInfoSync(&pb);
if (!err && (ResError() == noErr)) // Try opening the newly created prefs file if we made it
fPrefResFile = HOpenResFile(prefsVRefNum, prefsDirID, prefsFileName, fsRdWrPerm);
}
if (fPrefResFile != -1)
RMUseResFileCompat(fAppResFile);
return err;
}
/*****************************************************************************/
OSErr TPreferencesFile::ClosePreferencesFile(void)
{
OSStatus status = noErr;
OSStatus status2;
if (fPrefResFile != -1)
{
status = RMCloseResFileCompat(fPrefResFile);
fPrefResFile = -1;
}
status2 = RMUseResFileCompat(fAppResFile);
if (status)
return status;
return status2;
}
/*****************************************************************************/
OSErr TPreferencesFile::ExtractPreference(ResType PreferenceType, Handle& PreferenceHandle)
{
try
{
FailErr(RMUseResFileCompat(fPrefResFile));
FailErr(RMGetIndexedResourceCompat(PreferenceType, 1, true /* oneDeep */,
true /* resLoad */,
&PreferenceHandle));
FailNil(PreferenceHandle);
}
catch(OSErr err)
{
RMUseResFileCompat(fAppResFile);
return err; // this error is more useful than the one from RMUseResFileCompat()
}
return RMUseResFileCompat(fAppResFile);
}
/*****************************************************************************/
OSErr TPreferencesFile::SavePreference(ResType PreferenceType, Handle& PreferenceHandle)
{
try
{
UInt32 count;
FailErr(RMUseResFileCompat(fPrefResFile));
FailResErrorOrNil(PreferenceHandle);
FailErr(RMCountResourcesCompat(PreferenceType, true /* oneDeep */, &count));
if ( count > 0 )
{
FailErr(RMChangedResourceCompat(PreferenceHandle));
}
else
{
ResFileRefNum refNum;
FailErr(RMHomeResFileCompat(PreferenceHandle, &refNum));
if (refNum != fPrefResFile)
FailErr(RMAddResourceCompat(PreferenceHandle, PreferenceType, kPrefID, "\p"));
}
FailErr(RMUpdateResFileCompat(fPrefResFile));
}
catch(OSErr err)
{
RMUseResFileCompat(fAppResFile);
return err; // this error is more useful than the one from RMUseResFileCompat()
}
return RMUseResFileCompat(fAppResFile);
}
/*****************************************************************************/
TPreferencesFile::~TPreferencesFile()
{
this->ClosePreferencesFile();
}
/*****************************************************************************/